/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ipartek.formacion.gestformwww.modelo.clases;

import com.ipartek.formacion.gestformwww.modelo.beans.Asistencia;
import com.ipartek.formacion.gestformwww.modelo.beans.excepciones.GestorFormacionExcepcion;
import com.ipartek.formacion.gestformwww.modelo.interfaces.IAsistenciaDAO;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * @author 
 */
public class SQLServerAsistenciaDAO implements IAsistenciaDAO {

    private static ResourceBundle rb;

    public SQLServerAsistenciaDAO() {
        rb = ResourceBundle.getBundle("com.ipartek.formacion.gestformwww.controlador.excepciones");
    }

    /**
     * Método que crea la asistencia de un alumno.
     * @author: Sara y Alvaro
     * @param rs
     * @return  devuelve asistencia de la clase Asistencia
     */
    private Asistencia crearAsistencia(ResultSet rs) throws SQLException {
        Asistencia asistencia = new Asistencia();

        asistencia.setAluId(rs.getInt("AluId"));
        asistencia.setAsiFch(rs.getTimestamp("AsiFcha"));
        asistencia.setAsiJustificada(rs.getBoolean("AsiJustificada"));
        asistencia.setAsiObserv(rs.getString("AsiObserv"));
        asistencia.setCurId(rs.getInt("CurId"));

        return asistencia;
    }

    /**
     * Método que busca las asistencias de un alumno.
     * @author
     * @param idAlumno
     * @return  devuelve las asistencias del alumno elegido
     */
    public ArrayList<Asistencia> buscarAsistencia(int idAlumno, int idCurso) throws GestorFormacionExcepcion {
        Asistencia asistencia = new Asistencia();
        ArrayList<Asistencia> asistencias = new ArrayList<Asistencia>();
        Connection con;

        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerAsistenciaDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            PreparedStatement stmt = con.prepareStatement("SELECT AluId, AsiFcha, AsiJustificada, AsiObserv, CurId FROM asistencia WHERE AluId=? AND CurId=?");
            stmt.setInt(1, idAlumno);
            stmt.setInt(2, idCurso);
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                asistencia = crearAsistencia(rs);
                asistencias.add(asistencia);
            }
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerAsistenciaDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(con);
        }
        return asistencias;
    }
/**
     * Método que crea las faltas de asistencia de un alumno.
     * @author
     * @param Objeto Asistencia
     */
     /**
     * Método que crea faltas de un alumno en un curso.
     * @Aitor y Xarles
     * @param Recibe una asistencia de tipo Asistencia.
     * @return No devuelve nada.
     */

    /**
     * Método que busca las asistencias de un alumno para una determinada fecha.
     * @author Sara y Adrian
     * @param idAlumno: Identificador del alumno
     * @param idCurso: Identificador del curso
     * @param fecha: la fecha en la que queremos buscar
     * @return  devuelve true si ha encontrado una falta en esa fecha para ese alumno en ese curso
     */
    public boolean buscarAsistencia(int idAlumno, int idCurso, Timestamp fecha) throws GestorFormacionExcepcion {
        boolean esta = false;
        Connection con;

        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerAsistenciaDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            PreparedStatement stmt = con.prepareStatement("SELECT AluId, AsiFcha, AsiJustificada, AsiObserv, CurId FROM asistencia WHERE AluId=? AND CurId=? AND AsiFcha=?");
            stmt.setInt(1, idAlumno);
            stmt.setInt(2, idCurso);
            stmt.setTimestamp(3, fecha);
            ResultSet rs = stmt.executeQuery();
            if (rs.next()) {
                esta = true;
            }
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerAsistenciaDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(con);
        }
        return esta;
    }

    public void crearFalta(Asistencia asistencia) throws GestorFormacionExcepcion {
        Connection con;
        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerAsistenciaDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }
        try {
            PreparedStatement stmt = con.prepareStatement("INSERT INTO Asistencia (AluId, AsiFcha, AsiJustificada, AsiObserv, CurId) VALUES(?,?,?,?,?)");
            stmt.setInt(1, asistencia.getAluId());
            stmt.setTimestamp(2, asistencia.getAsiFch());
            stmt.setBoolean(3, asistencia.isAsiJustificada());
            stmt.setString(4, asistencia.getAsiObserv());
            stmt.setInt(5, asistencia.getCurId());
            stmt.executeUpdate();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerAsistenciaDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(con);
        }
    }
/**
     * Método que borra las faltas de asistencia de un alumno.
     * @author
     * @param ArrayList de objetos Asistencia
     */
    /**
     * Método que borra faltas de un alumno en un curso.
     * @Aitor y Xarles
     * @param Recibe un array de asistencias de tipo Asistencia.
     * @return No devuelve nada.
     */

    public void borrarFalta(ArrayList<Asistencia> asistencia) throws GestorFormacionExcepcion {
        Connection con;

        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerAsistenciaDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }
        try {


            for (int i = 0; i < asistencia.size(); i++) {
                PreparedStatement stmt = con.prepareStatement("DELETE FROM Asistencia WHERE AluId=? AND CurId=? AND AsiFcha=?");
                stmt.setInt(1, asistencia.get(i).getAluId());
                stmt.setInt(2, asistencia.get(i).getCurId());
                stmt.setTimestamp(3, asistencia.get(i).getAsiFch());
                stmt.executeUpdate();
            }
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerAsistenciaDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(con);
        }


    }
}
